package com.broada.apm.dao;

import java.util.Date;
import java.util.List;

import com.broada.apm.model.SSLCertificate;
import com.broada.apm.model.Service;

public interface ServiceDao {

	/**
	 * 添加服务节点(业务组件)
	 * @param node
	 */
	public void addService(Service service);
	
	/**
	 * 修改服务节点
	 * @param service
	 */
	public void updateService(Service service);
	
	/**
	 * 修改服务节点名
	 * @param service
	 */
	public void updateServiceName(Service service);
	
	/**
	 * 删除服务节点
	 * @param service
	 */
	public void deleteService(Service service);
	
	/**
	 * 根据服务节点id查询
	 * @param serviceId
	 * @return
	 */
	public Service getServiceById(String serviceId);
	
	/**
	 * 根据应用系统id查询服务节点
	 * @param appId
	 * @return
	 */
	public List<Service> getServicesByAppId(String appId);

	/**
	 * 删除应用系统关联的服务节点
	 * @param appId
	 */
	public void deleteServiceByAppId(String appId);

	/**
	 * 查询集群子节点
	 * @param clusterId
	 * @return
	 */
	public List<Service> getChildServiceByClusterId(String clusterId);

	/**
	 * 通过IP和Port获取自动发现服务节点
	 * @param ip
	 * @param port
	 * @return
	 */
	public List<Service> getDisServiceByIpAndPort(Service service);

	/**
	 * 根据自动发现服务节点id查询
	 * @param serviceId
	 * @return
	 */
	public Service getDisServiceById(String serviceId);

	/**
	 * 修改自动发现服务节点
	 * @param disService
	 */
	public void updateDisService(Service service);

	public List<Service> getDisServiceByIpNum(long ipNum);

	/**
	 * 根据关键字模糊查询自动发现服务节点
	 * @param service
	 * @return
	 */
	public List<Service> getDisServiceByProtocal(Service service, String ordeBy, boolean asc);

	/**
	 * 手动添加自动发现服务节点
	 * @param service
	 */
	public void addDisService(Service service);

	/**
	 * 查询所有非集群节点
	 * @return 
	 */
	public List<Service> getAllServicesNotCluster();

	/**
	 * 根据服务节点查询ssl证书
	 * @param serviceId
	 * @return
	 */
	public SSLCertificate getSSLByServiceId(String serviceId);

	/**
	 * 新增ssl证书
	 * @param sslCertificate
	 */
	public void addSSLCertificate(SSLCertificate sslCertificate);

	/**
	 * 更新ssl证书
	 * @param sslCertificate
	 */
	public void updateSSLCertificate(SSLCertificate sslCertificate);

	/**
	 * 删除ssl证书
	 * @param sslCertificate
	 */
	public void deleteSSLCertificate(SSLCertificate sslCertificate);

	/**
	 * 根据服务名称来查询服务节点
	 * @param service
	 * @param keyWord
	 * @param orderBy
	 * @param desc
	 * @return
	 */
	public List<Service> getDisServiceByKeyWord(Service service, String keyWord, String orderBy, boolean desc);

	/**
	 * 根据IP+PORT查找服务节点
	 * @param service
	 * @param orderBy
	 * @param desc
	 * @return
	 */
	public List<Service> getDisServiceByCondition(Service service, String orderBy, boolean desc);

	/**
	 * 删除手动添加的节点
	 * @param service
	 */
	public void deleteDiscoveryService(Service service);

	/**
	 * 根据业务节点id查找topo节点
	 * @param id
	 * @return
	 */
	public List<Service> getTopoServiceBySerivceId(String id);

	/**
	 * 根据IP和PORT查找应用节点
	 * @param service
	 * @return
	 */
	public Service getAppServiceByIpAndPort(Service service);

	/**
	 * 查询时候关注的服务节点
	 * @param service
	 * @return
	 */
	public List<Service> getDisServiceFocusOrNot(Service service, String serviceType, String orderByMysql, boolean desc, int pageSize, int pageIndex, int severity, Date startDate, Date endDate);

	/**
	 * 查询已关注的服务节点个数或所有服务节点
	 * @param i
	 * @return
	 */
	public int getServiceCount(int focus);

	/**
	 * 关注或取消关注服务节点
	 * @param service
	 */
	public void updateDisServiceFocus(Service service);

	/**
	 * 查询标签节点
	 * @param ip
	 * @return
	 */
	public List<Service> getDisServiceByLabelName(String ip);

	/**
	 * 根据目标节点id获取过滤IP
	 * @param dstId
	 * @return
	 */
	public List<String> getIpsByServiceId(String dstId);

	/**
	 * 获取某个应用系统下的所有过滤IP
	 * @param appId
	 * @return
	 */
	public List<String> getIpsByAppId(String appId);

	/**
	 * 设置lua
	 * @param service
	 */
	public void updateDisServiceLua(Service service);

	/**
	 * 更新topo服务节点发现协议
	 * @param service
	 */
	public void updateServiceLikeDisId(Service service);
	
	/**
	 * 查询所有服务节点
	 */
	public List<Service> getAllDisService();
	
	/**
	 * 查询所有已关注的服务节点
	 */
	public List<Service> getAllFocusedDisService();

	public String getClusterServiceByChildId(String serviceId);
	
	/**
	 * 根据serviceIds
	 * @param serviceIds
	 */
	public void deleteDiscoveryServiceByIds(List<String> serviceIds);
	
	/**
	 * 针对新接入的数据，根据节点组id查询子节点id
	 * @param applicationId
	 * @return
	 */
	public List<String> getChildrenServiceIds(String applicationId);
	
}
